package com.neusoft.dynamicagent;

import com.neusoft.staticagent.UmsAdminService;
import com.neusoft.staticagent.UmsAdminServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author: duan
 * @Date: Create in 10:04 2020/10/31
 */
public class JDKDemo {
    public static void main(String[] args) {
        //代理的目标对象
        final UmsAdminService target = new UmsAdminServiceImpl();
        /*
            ClassLoader loader：当前类的加载器
            Class<?>[] interfaces：当前类的实现的接口
            InvocationHandler：JDK提供给我们实现动态代理接口
         */
        //自动生成代理对象
        UmsAdminService agent = (UmsAdminService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                /*匿名内部类对象，使用局部变量时，该局部变量必须使用final修饰*/
                new InvocationHandler() {
                    @Override
                    /*
                        Object proxy：当前调用代理中的方法的对象
                        Method method：当前执行的方法对象
                        Object[] args：方法需要的实参内容
                            所以method和args可以确定唯一一个方法
                     */
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("前置方法增强");
                        preAdvice();
                        //调用目标对象的方法，并将返回值保存在invoke引用中
                        Object invoke = method.invoke(target, args);
                        proAdivce();
                        System.out.println("后置方法增强");
                        return invoke;
                    }
                }
        );
        //通过代理对象调用insert方法
        agent.insert(null);
    }

    public static void preAdvice() {

    }

    public static void proAdivce() {

    }
}
